home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / COMMS / C035.ZIP / OLD_JMOD / JMODEM.XYW < prev    next >
Text File  |  1990-01-20  |  26KB  |  403 lines

  1. «LM10»«RM70»«RFA«FC»- «PN» -
  2. «FL»»
  3. «FC»J M O D E M
  4. File Transfer System
  5. Compliments of
  6.  Richard B. Johnson
  7. PROGRAM EXCHANGE
  8. (508) 922-3166
  9. «DA»
  10. «FL»«RHA«FR»JMODEM Protocol  Page «PN»
  11. «FL»
  12. »
  13. General:
  14. First Let me get this over with.
  15. MS-DOS is a registered trademark of Microsoft Corporation
  16. IBM, IBM-PC, IBM-XT, AT, are registered trademarks of International Business Machines, Inc. WILDCAT! is a trade~mark of Mustang Software. XMODEM is a public-domain file-transfer protocol developed by Ward Christensen.
  17.  
  18. JMODEM is released into the public domain. As with most public-domain protocols, you are advised that there is no implied warranty of any kind. The source-code is provided so that you may determine for yourself if this program may serve a useful purpose. It is written in Microsoft MASM Assembly-language using good standards of engineering practice. It does not use any strange or "undocumented" functions of the MS-DOS operating system.
  19.  
  20.     PLEASE UPLOAD THIS FILE (The ARC file) to as many
  21.     BBS systems as you can so that it gets installed
  22.     all around the country.
  23.  
  24. Introduction:
  25. JMODEM is a new file-transfer protocol developed to be used as an "external protocol" on BBS systems and personal com~puters using the IBM-PC/AT/XT structure and the MS-DOS oper~ating system.
  26.  
  27. This file-transfer system features:
  28.  
  29.     o    16-bit CRC for verification
  30.     o    File size is exactly maintained
  31.     o    Data compression.
  32.     o    Rapid host/remote synchronization.
  33.     o    Variable-length transmission blocks which,
  34.         if there are few errors, increase to 8192
  35.         data-bytes in length.
  36.     o    Flow control (automatic)
  37.     o    Hangup protection
  38.     o    Aborted files are saved
  39.     o    Files being overwritten are renamed to
  40.         ".OLD", rather than deleted.
  41.     o    COM1 - COM4 support.
  42.     o    Interrupt on received characters allows data
  43.         to be received while the previous block is
  44.         being written to disk. This provides almost
  45.         continuous data transmission without long
  46.         waits between blocks.
  47.  
  48. JMODEM is not for everyone! It does not have any pretty screens to dazzle the user. It is designed to maximize the amount of data that can be transferred in a given time (and reduce telephone cost). It does this by sending very long blocks of data and encoding (compressing) the data wherever possible. Since long blocks of data are subject to many transmission errors, a 16 bit CRC is used to determine the data integrity. As many as ten retries are made if the data is not correctly received. If you have a noisy telephone circuit, you will find that JMODEM will abort more often than the XMODEM protocol which sends very short blocks. A future version that will be downward-compatible with the existing version is being developed that will do "heroic" retries and will even go down to a 16-byte block-lengths if that's what is necessary to get the data transferred.
  49.  
  50. Once synchronization between the remote computer and the host are established, JMODEM paints a status block on the screen that shows how the file transfer is going. The status screen shows the block being transmitted (or the last re~ceiv~ed), the length of the block, and the total bytes having been transmitted (or received). A special synch~roniza~tion routine is used so that the first block is not thrown away as happens so often in XMODEM type routines. During the synchronization routine, where the host is waiting for the user to enter the proper file parameters (a 30 second wait).  You can abort immediately by sending a control X (^X). After actual file transfer begins, ie. when you see the status win~dow on the screen, no input from the keyboard is pos~sible. You send a control BREAK to abort the transmission (or ^C). In this case, the program will abort after the block being sent/received is complete. This could take 15 or more seconds with long blocks so be patient.
  51.  
  52. In the event that carrier is lost (the user disconnected), the file-transfer program will also abort. This, too, could take as long as 15 seconds. JMODEM has logic to determine if the modem carrier was present when it started. This will allow you to transfer files between computers with a wire without having to tie the RLSD lead high.
  53.  
  54. How it works:
  55. The block size starts out at 512 bytes (or the actual bytes in the file -- whichever is less). To this is added a 6-byte overhead. If the block transfer occurred without any re~tries, the block length is increased by 512 bytes to 1024 bytes. As long as the transmission was successful without incurring any re-tries, the block-length increases to a max~imum of 8192 bytes. There is still the same 6-byte over~head so the maximum block length will actually be 8198 bytes. Any time there are retries, the block length (on the next new string) is decreased by 512 bytes. The string-length is never reduced to less than 512 bytes due to errors. When the last bytes are read from the file, the block length may be as little as 7 bytes (one data byte, plus the 6 byte over~head). The file size as received will be exactly the file size as transmitted. XMODEM will "round-up" the file size to the next higher block. This means that MS-DOS's COMP (com~pare) will always fail when you attempt to check files that have been sent by XMODEM and many other protocols.
  56.  
  57. When the file is read, an attempt is made to compress the data using the well-known RLL process where multiple bytes are compressed into a 4-byte statement.
  58.  
  59. For instance a string that looks like this (hex):
  60.     A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0
  61. Gets compressed into this:
  62.     BB 0F 00 A0
  63.      |  |  |  |__________ Byte to repeat
  64.        |  |  |_____________ High byte of repeat length
  65.        |  |________________ Low byte of repeat length
  66.        |___________________ Sentinel Byte
  67.  
  68. The sentinel-byte (BBH), when encountered in a data stream will get expanded to four bytes. Therefore, it is possible for the "compressed" data string to actually be longer than the original. If this occurs, the original string is sent rather than the longer encoded one. Since the kind of data sent can be different from block-to-block, it is necessary to send a control-byte along with the data so the receiver had determine how to operate on the data.
  69.  
  70. This is the control structure:
  71.  
  72. 00 02 00 0B 01 02 03 04 05 06 07 08 09 0A .... 0A EA
  73.  |  |  |  |  |                                 |  |_ CRC
  74.  |  |  |  |  |                                 |____ CRC
  75.  |  |  |  |  |______________________________________ data
  76.  |  |  |  |_________________________________________ rec.
  77.  |  |  |____________________________________________ control
  78.  |  |_______________________________________________ length
  79.  |__________________________________________________ Length
  80.  
  81. Two bytes are used for the string length and two bytes are used for the CRC. As is standard in memory, the high-byte looks "to people using DEBUG" swapped with the low byte. The data is transmitted exactly as the memory image.
  82.  
  83. The length (a word) begins the string so the receiver may know exactly how may bytes to receive.
  84.  
  85. The control byte is bit-mapped to 8 possibilities. The ones most important are:
  86.  
  87.         NORMAL DATA
  88.         COMPRESSED DATA
  89.         END OF FILE
  90.         ABORT
  91.  
  92. This is now the receiver "knows" what to do with the data.
  93.  
  94. The CRC is generated using this polynomial:
  95.  
  96. X =  X + X^(2(n-mod 7)).......  Where n = t(n-1)
  97.                  And t = string length
  98.  
  99. It has the advantage of simplicity in assembly-language programming and will detect errors with a probability of about  one undetected error in 2^132 (which is a very large number). It does not correct errors so its not important to use some "standard" function to generate the CRC.
  100.  
  101. Support for COM3 and COM4 have been added on revision level V1.05 . Note that the standards for port locations are de-facto standards only and may not be the ports actually used in your computer. Please modify the communications port structures at the beginning of the assembly-language program to match your system parameters if they are different. The modifications should be done to the STRUCTURES, not to the EQUATES!
  102.  
  103. Revision level V1.09 brings musical exit status. If the file transfer was successful, the computer plays "victory". If the file transfer was aborted, the computer plays "retreat". Since the BBS SysOp is unlikely to want his computer to play bugle-calls well into the evening, the user has the option of turning the music off. This is done by setting an en~viron~ment variable string:
  104.  
  105. SET JMODEM=SHUTUP
  106.  
  107.     ... Will accomplish the desired result.
  108. Usage:
  109. This program uses parameters on the command line.
  110.  
  111. JMODEM S <filename.typ>    ( Sends a file to COM1:)
  112. JMODEM R <filename.typ>    ( Receives a file from COM1:)
  113. JMODEM S1 <filename.typ>    ( Sends a file to COM1:)
  114. JMODEM R1 <filename.typ>    ( Receives a file from COM1:)
  115. JMODEM S2 <filename.typ>    ( Sends a file to COM2:)
  116. JMODEM R2 <filename.typ>    ( Receives a file from COM2:)
  117.  
  118. After version 1.05, JMODEM supported communications adapter ports 1 through 4.
  119.  
  120. In a batch file, <filename.typ> may be a substitution character.
  121. JMODEM S2 %1            ( Sends a file to COM2:)
  122. JMODEM R2 %1            ( Receives a file from COM2:)
  123. «PG»
  124. «FC»Setting up a Communications Program
  125. External File-Transfer Protocol.
  126. «FL»
  127. On my system, TELIX resides in the C:\TELIX directory. A copy of JMODEM.COM is also in that directory. TELIX passes the filename as the %3 parameter. Therefore the contents of JUP.BAT is:
  128.  
  129.         C:\TELIX\JMODEM S1 %3
  130.  
  131. The contents of JDOWN.BAT are:
  132.  
  133.         C:\TELIX\JMODEM R1 %3
  134.  
  135. If I wished to receive in the "batch" mode, I could make a file like this. Notice that some communications programs do not allow multiple file names. Note that the comments "!" are NOT ALLOWED in a DOS batch file.
  136.  
  137.         :DO_LOOP           ! Return here
  138.         IF "%3" == "" GOTO DONE       ! More parameters?
  139.         C:\TELIX\JMODEM R1 %3       ! Execute JMODEM
  140.         IF ERRORLEVEL 1 GOTO DONE  ! Abort on error
  141.         SHIFT               ! %4 becomes %3
  142.         GOTO DO_LOOP           ! Continue
  143.         :DONE               ! Exit batch file
  144.  
  145. If you do not know what "%" parameters are used to pass the file name, all you have to do is make a "dummy" batch file that contains the following:
  146.  
  147.         @ECHO OFF
  148.         ECHO %1
  149.         ECHO %2
  150.         ECHO %3
  151.         ECHO %4
  152.         ECHO %5
  153.         PAUSE
  154.  
  155. When this is executed, you will see something like this:
  156.  
  157.     1200
  158.     1
  159.     FILENAME.TYP
  160.     ECHO is off
  161.     ECHO is off
  162.     Strike a key when ready . . .
  163.  
  164. The first line contains "1200" which is the baud rate. This means that the %1 parameter contains the baud rate.
  165.  
  166. The second line contains "1" which is the communications adapter port being used. This means that the port is being passed as the %2 parameter.
  167.  
  168. The third line contains "FILENAME.TYP" which is the file name. This means that the file name is being passed as the %3 parameter.
  169.  
  170. The fourth and fifth lines contain nothing to echo so DOS replies the current state of the echo function which is "off".
  171.  
  172. PCPLUS handles the file name passing a little bit different. If I execute the same "dummy" batch file from the PCPLUS directory, the response is:
  173.  
  174.     FILENAME.TYP
  175.     ECHO is off
  176.     ECHO is off
  177.     ECHO is off
  178.     ECHO is off
  179.     Strike a key when ready . . .
  180.  
  181. This shows us that PCPLUS passes the file name as the first parameter and there are no other parameters. However, If I put more parameters on the command line within PCPLUS, they will get sent to the batch file. The response is:
  182.  
  183.     FILENAME.001
  184.     FILENAME.002
  185.     FILENAME.003
  186.     FILENAME.
  187.     ECHO is off
  188.     Strike a key when ready . . .
  189.  
  190. Therefore PCPLUS allows up to four file names to be passed providing there's room on the command line.
  191.  
  192. Notice that these two communications programs check the default directory for the external protocol batch file FIRST! Therefore you must make certain that there are no other similarly-named batch files in the current directory or within the current path. Failure to do so will cause the improper execution of the wrong batch file. Lets say that the path was "C:\DOS;C:\TOOLS;C:\PCPLUS;C:\TELIX;C:\QMODEM". If you named all your JMODEM external protocol batch files with the same name, and you were attempting to use an ex~ternal file transfer protocol from QMODEM, the batch file designed to operate with PCPLUS would be the first one "found" and executed since the search-path will search the \PCPLUS directory before the \QMODEM directory. You prevent the execution of the incorrect batch file by calling them slightly different names.
  193.  
  194. When setting up external protocols, remember to configure the communications program so that it prompts you for the file names. Unlike some protocols, JMODEM does not transfer the file name. You can use any file name that you wish. You must pass the file name to JMODEM since it must know the name of the file being transmitted or received. There are no defaults.
  195. «PG»
  196. «FC»Setting up a BBS System
  197. External File-Transfer Protocol.
  198. «FL»
  199.  
  200. If you are running a WILDCAT! bulletin board, the external protocol files can be set up like this:
  201.  
  202.         (JUP.BAT)
  203.         CD D:\WILDCAT\PROTOCOL
  204.         IF EXIST TRANSFER.BAD DEL TRANSFER.BAD
  205.         JMODEM R1 %3
  206.         IF ERRORLEVEL 1 GOTO END
  207.         COPY %3 %4
  208.         :END
  209.         DEL %3
  210.  
  211.         (JDOWN.BAT)
  212.         CD D:\WILDCAT\PROTOCOL
  213.         IF EXIST TRANSFER.BAD DEL TRANSFER.BAD
  214.         JMODEM S1 %3
  215.         IF ERRORLEVEL 1 GOTO BAD
  216.         GOTO END
  217.         :BAD
  218.         COPY ALL.OK TRANSFER.BAD
  219.         :END
  220.  
  221. There are many variations available. Since WILDCAT! supports batch-mode downloading, you could set up the batch file like this:
  222.  
  223.         (JDOWN.BAT)
  224.         CD D:\WILDCAT\PROTOCOL
  225.         IF EXIST TRANSFER.BAD DEL TRANSFER.BAD
  226.         :DO_LOOP
  227.         IF "%3" == "" GOTO END
  228.         JMODEM S1 %3
  229.         IF ERRORLEVEL 1 GOTO BAD
  230.         SHIFT
  231.         GOTO DO_LOOP
  232.         :BAD
  233.         COPY ALL.OK TRANSFER.BAD
  234.         :END
  235.  
  236. WILDCAT! checks the \PROTOCOL directory to see if the file TRANSFER.BAD has been created. If it exists, it announces that the file transfer has failed. It also announces "Error with external protocol .. ". It does this when, in fact, WILDCAT!  has made an error itself. In many cases WILDCAT! will "find" the file TRANSFER.BAD when it DOES NOT EXIST! In spite of this bug, WILDCAT! is one of the most reliable BBS systems supporting external protocols.
  237.  
  238. When setting up batch files remember that there is also a bug in all DOS versions. The "IF ERRORLEVEL " statement does NOT test the actual value of ERRORLEVEL! Instead it checks to see if the returned value is EQUAL or GREATER than the tested value. If you were to put the statement:
  239.  
  240.         IF ERRORLEVEL 0 GOTO GOOD
  241.  
  242. .... in a batch file, the execution would ALWAYS branch to label "GOOD" regardless of the actual ERRORLEVEL returned! More about bugs when we get to the "BAD BBS" section towards the end.
  243.  
  244. JMODEM does not require any information about handshaking. It will look at the modem port and figure out for itself what to do.
  245.  
  246. In the event that the modem carrier is lost, JMODEM will abort. Since JMODEM only checks the modem port occasionally, it may take several seconds to abort when the carrier is lost. It is impossible for a user to get at the DOS level through JMODEM. Do NOT use the CTTY command in the external protocol batch files. JMODEM returns ERRORLEVEL 1 if there was any error in transmission or reception. It returns ERRORLEVEL 0 (no error) otherwise. It does not delete files that have been partially received although it properly clos~es them. The system operator can arrange the batch files to delete them if required.
  247.  
  248. When JMODEM attempts to create a file that already exists it can't ask the user if the old one should be deleted since the user is probably not in a terminal program at the time. Therefore, JMODEM renames the other file to <filename.OLD> and creates the new file. In the event that <filaname.OLD> exists, it is deleted before the rename operation occurs.
  249.  
  250. If you don't know what parameters are being sent to external protocols, you can make a dummy batch file to check them using the DOS's echo command just as explained in the user interface previous to this "BBS" section. You can't see the parameters being echoed from a remote terminal. You must be present at the BBS board terminal to test those parameters unless you modify the dummy command file like this:
  251.  
  252.         @ECHO OFF
  253.         ECHO %1>COM1
  254.         ECHO %2>COM1
  255.         ECHO %3>COM1
  256.         ECHO %4>COM1
  257.         ECHO %5>COM1
  258.  
  259. If you find that your system passes the file name as %3, your "upload" (receive) batch file would contain this:
  260.  
  261.         JMODEM R1 %3
  262.  
  263. Your "download" (send) batch file would contain this:
  264.  
  265.         JMODEM S1 %3
  266.  
  267. In these examples, it is assumed that you are using communications adapter port "1".
  268.  
  269. «PG»
  270. «FC»The BAD BBS
  271. Problem.
  272. «FL»
  273. Believe it or not, there are several very fine running BBS systems in use that do not properly handle external proto~cols. MS-DOS provides the proper mechanism for loading and executing "child" programs from within the "parent" pro~grams. This is function 4BH of the "DOS" INT 21H DOS inter~face. Instead of using this function, these poorly-behaved programs perform the external file-transfer protocol in the following (or similar) manner:
  274.  
  275.     (1) Make a DOS call to find the file-size of the external file-transfer protocol.
  276.  
  277.     (2) Free up an array of memory from "string-space" within the program that is large enough to copy the external file transfer contents into it. As assumption about the data-space required by the external file transfer program is made based upon the "block-size" information that has been entered during configuration.
  278.  
  279.     (3) Loads the file into string-space memory.
  280.  
  281.     (4) If its an ".EXE" file, ignore the header.
  282.  
  283.     (5) CALL the first byte of code!
  284.  
  285.     If JMODEM is run in this environment, it WILL crash the system. JMODEM assumes that it has been placed in memory by MS-DOS and that an entire segment (64k) is available to run. JMODEM uses two buffers that are almost 32k in length! One of the buffers is used to support data compression and expansion. The other is used for the interrupt buffer.
  286.  
  287. If you have such a BBS system and you wish to run JMODEM, you can make a simple modification to the source-code, and re-compile to produce a version which is a bit slower to initialize and exit, but is guaranteed to leave all memory and registers EXACTLY as they were when JMODEM got control. This is done by saving and restoring all registers. Ad~ditionally, any data space that will be modified is copied to a file called VIRTUAL.MEM, then restored from that file just before JMODEM exits.
  288.  
  289. You modify the source-code by finding the "BAD_BBS" equate near the beginning of the file. This is normally set to "FALSE". You set this to "TRUE". Then you recompile in the following manner:
  290.  
  291.     MASM JMODEM;
  292.     LINK JMODEM;
  293.     EXE2BIN JMODEM.EXE JMODEM.COM
  294.     DEL JMODEM.EXE
  295.  
  296. Do NOT attempt to execute the ".EXE" version. You must change JMODEM to a ".COM" file. If you do not have EXE2BIN.COM to make the change, you can use DOS's DEBUG to do the same thing. You do it this way:
  297.  
  298. F:\DEV> debug jmodem.exe    ; DOS command line
  299. -rcx                ; Examine CX registerCX 1239            ; Debug says the size was 1239
  300. :
  301. -h 1239,100            ; Calculate 1239H - 100H1339  1139            ; Sum = 1339H, dif = 1139H
  302. -rcx                ; Examine register againCX 1239            ; Is 1239H
  303. :1139                ; Change to 1139H                ; .. subtract 100H
  304. -njmodem.com            ; Name new SAVE file name-w                ; Write to file
  305. Writing 1139 bytes        ; Debug prompts
  306. -q                ; Exit
  307. F:\DEV>            ; Back to DOS
  308.  
  309. When you use this version of JMODEM, it will take a little while longer to load and exit because it must write a 64k block of memory to a file and read / delete in upon exit.
  310. «PG»
  311. «FC»When things don't work!
  312. «FL»
  313. The early versions of JMODEM assumed that it was being properly loaded either by COMMAND.COM, the resident command processor, or by a "parent" process that properly executes the DOS function 1BH (the EXEC function). Much to my sur~prise, I found that much BBS system software is not written properly. Starting at version V1.10, I included the "BAD_BBS" routines to help overcome some of the loading problems that these BBS systems have. In some cases this work-around was successful and in others it was not. In version V1.13, I included some tests that verify whether or not JMODEM has been loaded properly. Instead of crashing the system, JMODEM now prints an error message and exits. These error messages can help you find out what the problem is and, hopefully, obtain a solution.
  314.  
  315. Presently, when JMODEM is loaded one of the first things it does is make a DOS call to give up all memory except that which contains the code. If DOS returns an error, it means that JMODEM was not loaded properly and therefore doesn't own any memory to give up! If an error message appears telling you that JMODEM doesn't own any memory, you must contact the writer of your BBS system software to obtain a version that has this bug fixed. There will be no way to execute JMODEM in this kind of environment without risking serious system crashes.
  316.  
  317. The next thing JMODEM does is make a DOS call, requesting 64k (-1) bytes of memory for its necessary buffer space. If this DOS call fails, a message is printed stating that there is not enough memory available for JMODEM. In this case, you simply reconfigure your BBS software to provide enough mem~ory for the external protocol. On some BBS systems, this is done by defining "block-size". Generally, you just specify the largest number that your BBS software will accept and therefore force the BBS system software to allocate a large block of memory for the external protocol.
  318.  
  319. Although the code size of JMODEM is small (around 4k), it requires just as much memory as other external protocols. The memory is used for three major buffers:
  320.     (1) Data buffer     8198 bytes
  321.     (2) Encode/decode buffer 32,767 bytes
  322.     (3) Interrupt buffer 20,000 bytes
  323.  
  324. These buffers are put in a separate segment so a wild bit-stream input cannot cause a system crash. The index used for addressing memory in the interrupt buffer simply wraps around past 64k, back to zero. Of course you get data errors when this happens, but no crash, and if the incoming bit-stream ends before a time-out, the error is recoverable. When satellite links lose lock, the result is usually a 20 to 30 second burst of noise (random bit-stream). At 9600 baud, you can easily overflow a buffer if it is not large enough or is not allowed to wrap. Alternative methods are to limit the size of the buffer and check the limit every time a byte is put in the buffer. JMODEM doesn't do this for two reasons. The first is the increased software overhead (the check must be made for every byte in the interrupt service routine) and the second is that you may be waiting for an ACK. JMODEM always preserves the last byte in the buffer so that, even with a noisy reverse-channel, the ACK/NAK can be extracted.
  325.  
  326. These are the error messages and what they mean.
  327.  
  328. JMODEM error message:
  329. Specified file "" not found
  330.  
  331. This means that no file name was passed to JMODEM on the command line during a download.
  332.  
  333. JMODEM error message:
  334. Specified file "\D:PATH\FILENAME.TYP" not found
  335.  
  336. This means that an incorrect file name was passed to JMODEM on the command line during a download.
  337.  
  338. JMODEM error message:
  339. Specified file "" Can't be created.
  340.  
  341. This means that no file name was passed to JMODEM on the command line during an upload.
  342.  
  343. JMODEM error message:
  344. Specified file "\D:PATH\FILENAME.TYP" Can't be created.
  345.  
  346. This means that an incorrect file name was passed to JMODEM on the command line during an upload or:
  347.  
  348.     o    The path doesn't exist
  349.     o    The drive doesn't exist
  350.     o    Not enough file handles
  351.         Put FILES=40 in CONFIG.SYS and reboot
  352.     o    Attempt to write to a network drive
  353.         If you are not networked, do NOT install SHARE
  354.  
  355. JMODEM error message:
  356. File transfer aborted!
  357.  
  358. This is a normal abort. If the user didn't abort then the active communications adapter port is not being passed to JMODEM correctly.
  359. «PG»
  360. JMODEM error message:
  361. Modem carrier failed.
  362.  
  363. Modem either was not online or the user hung up during protocol execution.
  364.  
  365. JMODEM error message:
  366. Can't execute, no free RAM!
  367.  
  368. A poorly-written BBS system attempted to load the program as a subroutine and execute it. Contact the BBS software writer.
  369.  
  370. JMODEM error message:
  371. This program was already loaded over resident code.
  372. The system will probably crash!
  373.  
  374. A poorly-written BBS system just loaded JMODEM over its own code!
  375.  
  376. JMODEM error message: Can't create file VIRTUAL.MEM
  377. JMODEM error message: Can't write file VIRTUAL.MEM
  378. JMODEM error message: Can't close file VIRTUAL.MEM
  379. JMODEM error message: Can't open file VIRTUAL.MEM
  380. JMODEM error message: Can't delete file VIRTUAL.MEM
  381.  
  382. When compiled with the BAD_BBS system conditional set to "TRUE", JMODEM was unable to do the required file I/O be~cause something was screwed up by the BBS software or there were not enough file handles available. Enter FILES=40 in CONFIG.SYS and reboot. This can also happen if SHARE is installed and no network exists. Do NOT use SHARE if you are not networked!
  383.  
  384. JMODEM error message:
  385. DOS reports that JMODEM was improperly loaded and does not own the memory it is using!
  386.  
  387. The BBS system software is either improperly configured or improperly written for external protocols. Contact the writer of the BBS system software.
  388.  
  389. JMODEM error message:
  390. Not enough free memory for JMODEM to use!
  391.  
  392. The BBS system software is not properly configured to give JMODEM the memory it requires to execute. Check the BBS system software documentation and reconfigure.
  393.  
  394. If you have problems using JMODEM with your system, you can call the PROGRAM EXCHANGE and leave a message You can also test your communications program's external file-transfer protocols by transferring files (hopefully uploading) to the PROGRAM EXCHANGE. Currently there are hundreds of boards that are using this protocol and the number is growing every day. Most problems encountered are found to be caused by incorrect file names being sent to JMODEM (the wrong "%" parameters). A simple batch file to test these parameters will go a long way towards solving the problems.
  395.  
  396.             Richard B. Johnson
  397.             PROGRAM EXCHANGE
  398.             (508) 922-3166
  399.             Beverly, Massachusetts
  400.  
  401.  
  402. - Finis -
  403.